perm filename HEUTIL.WRU[SYS,HE] blob sn#019464 filedate 1973-01-09 generic text, type T, neo UTF8
00100			THE HAND/EYE UTILITY ROUTINES
00200	
00300		This file, containing the utility routines for  the  Hand/Eye
00400	system,  can be obtained by REQUIRE "HEUTIL.SAI[SYS,HE]" SOURCE_FILE.
00500	This file REQUIREs the preamble and Quam's display  package  (version
00600	on   LIB,HE).    See  IIDRV.WRU[SYS,HE]  for  the  descriptin  of  an
00700	interpreter  for  running  the  routines  from  console  input.  Most
00800	internal  variables  are  prefixed  with  'U_'  so  there  will be no
00900	conflicts with your symbols, unless you are in the habit of using the
01000	same prefix.   The following variables and definitions may be of some
01100	use to you, but you are urged not to change the variables:
01200	
01300	⊃	is defined as COMMENT
01400	U_C	is defined as carriage return and line feed
01500	U_BLOB	is the  set of all blob items.  A blob is defined as a set of
01600		connected edges traced by the edge follower. It may be one or
01700		more objects.
01800	U_OBJ	is the set of all object items.  An object is something which
01900		was recognized by SIMPLE or COMPLEX.
02000	
02100	DSEND,DWAIT, DKILL, DSOURCE, DDEST, DNAME, DWAITM, DACT, and DACK are
02200		control bits for message procedures as described in  the
02300		message procedure documentation.
02400	
02500	
02600	
02700	
02800	INTERNAL PROCEDURES
02900	
03000		The following procedures are mainly for internal use but  may
03100	be of use to users:
03200	
03300	1.	STRING PROCEDURE PN(ITEMVAR X);
03400	
03500		Returns  the  print  name  of  the argument if it exists; the
03600	decimal item item number otherwise.
03700	
03800	2.	PROCEDURE U_RJEC(INTEGER ITEMVAR A);
03900	
04000		Removes the item from  the  internal  data  structures.   You
04100	should  call  this procedure before deleting a blob or object item if
04200	you did not call REJ_OBJ.
     

00100	UTILITY ROUTINES
00200	
00300		Below  are the utility procedures currently coded.  Hopefully
00400	their appearance to the user will not change even when  the  internal
00500	workings do.
00600	
00700	PROCEDURE U_INIT;
00800	
00900		Initializes the utility routines and the program.  It must be
01000	called  before  any other routines.  Among other things, it generates
01100	local print names for all declared global items, initializes the page
01200	printer (no other hand/eye job should do this when running under the
01300	monitor) and passes its name, II, to the message  procedure  handler.
01400	If the type flag (TYP_II) is TRUE, this procedure, as well as several
01500	others will type out messages to let the user know they ran and  what
01600	they did, or did not, do.
01700	
01800	PROCEDURE TAB_SET;
01900	
02000		Initializes the TABLE array in the global model which gives a
02100	3-D  description  of  the  world.   Until TAB_SET is called, routines
02200	which update TABLE will not do so and routine which look at it should
02300	not.
02400	
02500	INTEGER PROCEDURE JOB_START(STRING JOB);
02600	
02700		Trys to make sure the specified job is logged in and running.
02800	JOB is  the  logical  name  of  the  job  (see  the  section  on  job
02900	description and status for the logical names of currently implemented
03000	jobs.   If the name is not  recognized,  the  procedure  returns  -1.
03100	Otherwise, if the job specified is not running, it sends a message to
03200	the monitor to execute the proper login and load macro with the  save
03300	PPN as  the  monitor.    The macro file HEMACR[SYS,HE] must have been
03400	read in by the monitor.   When the job is running 1 is returned.   If
03500	the  job  did  not start within the required time, a zero is returned
03600	and the job is probably not there.    If you are running without  the
03700	monitor,  you  will  get  a  nasty  message  and the routine will not
03800	continue until you start the job.   Note that this program decides if
03900	a  job  is  running by checking its 'YES' flag in the global segment.
04000	It cannot tell if the job dies after setting its flag.
04100		Currently, the other utility procedures do not check  if  the
04200	jobs they are calling are there so you must (or at least should) call
04300	this routine before the first call  of  each  job  driver.  With  the
04400	description of each procedure are the logical names of the jobs which
04500	must be running for proper operation.
04600	
04700	SET PROCEDURE GETEDGE(INTEGER COUNT);
04800	
04900	JOBS: EDG  (also CAM if SIMPLE or COMPLEX are to be called)
05000	
05100		is the edge follower driver.  This routine finds the  outline
05200	of  blobs,  sometimes  with a few interior edges also.   COUNT is the
05300	number of blobs to find or <0 to find all blobs in the field of view.
05400	Due  to  the  way the edge follower works you may get more blobs than
05500	you requested, but you will never get fewer  unless  there  were  not
05600	enough  visible. 
07700		The  value  of  the  procedure  is  the  set  of  blob  items
07800	processed.  Some  of  the blobs may have been returned before. Seeing
07900	them again in the set means more edges were found and  if  CURVE  was
08000	called  for it, you might want to fit it again.  The program will try
08100	to find as many new blobs as you requested.
08400	
08500		The blob items have integer datums  which  contain  a  status
08600	word decoded as follows: (look but do not touch)
08700	
08800		BIT	NAME	DESCRIPTION
08900		1		an edge was lost during accomodation
09000		2		an edge hit another edge
09100		4		an edge was outside the field of view
09200		10	U_CLOSE	a closed curve has been found
09300		20	U_EDGE	the blob has been traced
09400		40	U_CURV	the blob has been curve fit (by CURVE)
09500		100	U_REC	the blob has  been  completely  recognized by
09600				COMPLEX
09700		200	U_SIMP	the blob has been recognized by SIMPLE
10000		2000	U_FINE	the blob has been processed by INNER
10100	
10200	SET PROCEDURE CURVE(SET BLOBS);
10300	
10400	JOBS: EDG, CUR
10500	
10600		is the curve fitter driver.  BLOBS is the set of blobs to  be
10700	curve fit, or {EVERY} to fit all of them.  EVERY is a declared global
10800	item. A blob already fit will not be fit again unless more edges have
10900	been  found  for  it.    Also,  some  blobs may be deleted during the
11000	fitting process if the curve fitter decides they are too small to fit
11100	(i.e.   patches  of noise).  The value of the procedure is the set of
11200	all blobs processed. The others were either deleted or  already  fit.
11300	In the latter case they are still in U_BLOB.
11400	
14100	SET PROCEDURE SIMPL(SET BLOBS, OBJECTS; REFERENCE SET NO_REC);
14200	
14300	JOBS: SIM
14400	
14500		is  the  driver  for  SIMPLE.   BLOBS is a set of blobs to be
14600	recognized. Unlike for the COMPLEX processing, they need not be  from
14700	a  single  call of GETEDGE.  OBJECTS is the set of prototypes you are
14800	interested in, such as CUBE, RPP122, etc. or  {EVERY}  if  you  don't
14900	care. The value of the procedure is the set of object items generated
15000	for recognized blobs.  NO_REC contains the  set  of  blobs  rejected.
15100	Either they were not recognized or they were recognized as prototypes
15200	not found in OBJECTS.  Blobs recognized previously or not  yet  curve
15300	fit  and  given  to  SIMPLE  again are ignored and will not appear in
15400	either set.  Once a blob is returned in the value set, it will not be
15500	sent to SIMPLE again, even if more edges are found.
15600	
15700	[the global model output of SIMPLE will be defined later.  For now it
15800	is described PREAMB.TXT[II,HE]    ]
15802	
15804	BOOLEAN PROCEDURE NEW_SIMP(REAL ARRAY ITEMVAR OBJ; REAL ARRAY TRANS);
15806	
15808		Changes the world model when an object is moved.  OBJ is  the
15810	object  item  with  the  old  transform.   TRANS is the transfrom the
15812	object should have after the move.  The result is FALSE only  if  OBJ
15814	has  not  already  been  processed by SIMPLE.  The edge follower data
15816	structure will be updated and the display of the object, if  any,  is
15818	turned off.  The object will not be displayed at its new location.
15900	
16000	PROCEDURE COMP(SET OBJS);
16100	
16200	JOBS: EDG
16300	
16400		This routine calls the edge  follower  to  compact  its  data
16500	structure.  OBJS is a set of objects to be compacted.  Each item must
16600	have an EDGES association in the global model.  This procedure can be
16700	used  to  tell  the  edge follower about objects it did not trace, to
16800	define areas inside of which it is not to look, to  redefine  objects
16900	when  the  camera transform is changed, or to save space and speed up
17000	edge  tracing.   See  the  discussion  of  the  COMPACT  command   in
17100	EYE.WRU[SYS,HE] for more information.  After all objects created from
17200	a blob have been compacted, the  blob  and  its  data  structure  are
17300	deleted.
17400	
17500	PROCEDURE REJ_OBJ(SET ITMS);
17600	
17700	JOBS: EDG
17800	
17900		All  items  in  the  set  are  deleted   after   all   global
18000	associations  generated  by  any of the other jobs are erased and the
18100	edge follower has been called to remove the item  from  its  internal
18200	structures.   After  all  objects  associated  with  a blob have been
18300	deleted, the blob is deleted also.
18400	
18500	SET PROCEDURE INNER(SET BLOBS);
18600	
18700	JOBS: EDG  (CAM if SIMPLE is to be called)
18800	
18900		This  routine  does a fine scan of each of the blobs given to
19000	it to try to find more edges. The output is a set of blobs processed,
19100	of  which BLOBS is a subset. It cannot be called more than once for a
19200	given object.
19500	
19600	SET PROCEDURE COLGET(SET OBJS);
19700	
19800	JOBS: COL
19900	
20000		This routine finds the colors of the visible  faces  of  each
20100	object  in  OBJS  which does not already have a color associated with
20200	it. The value of the procedure is the set of all  objects  for  which
20300	new  colors were found.  The rest already had all their visible faces
20400	colored.
20500	
20600	PROCEDURE DISP_OBJ(SET OBJS; BOOLEAN FLAG);
20700	
20800	JOBS: none
20900	
21000		This  routine  displays  the  visible faces of each object in
21100	OBJS.  If FLAG is TRUE, the face names and colors, if  any,  will  be
21200	displayed  in  the  center of each face and the object name displayed
21300	just below the object.
21400	
21500	PROCEDURE DISP_DEL(SET OBJS);
21600	
21700	JOBS: none
21800	
21900		All objects in set OBJS have their displays turned off (if it
22000	was  generated  by DISP_OBJ).  No error is indicated if an object was
22100	not  being  displayed.   This  routine  is  called  automatically  by
22200	REJ_OBJ.
22300	
22400	REAL PROCEDURE VERIF(INTEGER X1, Y1, X2, Y2);
22500	
22600	JOBS: VER
22700	
22800		The  verifier  is called to determine whether or not an edge,
22900	or line, exists between TV  coordinates  (X1,Y1)  and  (X2,Y2).   The
23000	value  of  the  procedure  is  the  confidence  of the program in the
23100	existance of an edge.
23200	
23300	BOOLEAN PROCEDURE CAMCHG(INTEGER COM, LENS; REAL X, Y, Z);
23400	
23500	JOBS: CAM
23600	
23700		CAMCHG changes the status of the TV camera (camera #1  only).
23800	If 1≤LENS≤2 then the lens will be changed to the 25mm (1) or 50mm (2)
23900	lens if it is not already there.  Global integer  CAMLENS  gives  the
24000	current lens number.  In addition, COM is decoded as follows:
24100	
24200	0	If LENS=1  or LENS=2 change  the lens  only.   If LENS=0 then
24300		update the camera transform. This call is necessary only if a
24400		program  changed  the TV pan, tilt,  focus,  or lens  without
24500		using this  procedure as  it will  update the transform after
24600		each change.
24700	1	Pan the camera by X radians, where the X axis is 0 and posit-
24800		ive X pans  to the left.  The current position  is in  global 
24900		real CAMPAN.
25000	2	Tilt the camera by Y radians, where the camera horizontal  is
25100		0 and positive Y tilts down.  The current position in in glo-
25200		bal real CAMTIL.
25300	3	Both pan and tilt as above, using X and Y.
25400	4	Focus  the camera  on a  plane Z inches from the lens center. 
25500		The  lens center  can be  found in  row 4 of the camera model
25600		(see  below).   Global  real  CAMRANGE contains  the  current
25700		focus.
25800	 	Focus and pan. Focus will always be done last.
25900	6	Focus and tilt.       "
26000	7	Focus, pan, and tilt. "
26100	10	Center then camera on point (X,Y,Z) in table coordinates.
26200	other	The procedure returns the value FALSE.
26300	
26400		If the requested action cannot be  performed,  the  procedure
26500	also  returns  the  value  FALSE and the global integer CAMFLG can be
26600	decoded to determine the error.  The value of the procedure  is  TRUE
26700	if the action was completed successfully.
26800	
26900	The error flag, CAMFLG, is decoded as follows:
27000	
27100	0	O.K. if procedure was TRUE; COM had an illegal value if FALSE
27200	1	SERVO routine failed. Hardware problem or bug in library pro-
27300		gram.   You may win  if you try again.   The camera model has
27400		been updated to the point where the motors stopped.
27500	2	LENS is not in the range 1-4.   You should not see this error
27600		since CAMCHG should notice it and ignore you.  The model will
27700		not be updated.
27800	3	Pan value is out of bounds. The model is not updated.
27900	4	Tilt value is out of bounds.     "
28000	5	Focus value is out of bounds.    "
28100	6	The  lens you asked for is not what you got.  Hardware error.
28200		you might win if you tried again.  The model has been updated
28300		for the lens specified in CAMLENS.  If it  is lens 3 or 4 the
28400		model is no good.
28500	7	LOOKUP failed  during initialization.  This error only occurs
28600		when the camera program is first started. If the YES_CAM flag
28700		does  not become  TRUE, this  may be the reason.  DATA[1,SHY]
28800		must be restored.
28900	8	Too many data misses when reading the pots.  Hardware problem
29000		which may go away if you try again.  The model is updated but
29100		may not be any good.
29200	9	Pots were too noisey when read.  Try again and don't let any-
29300		one jump up and down near the camera.  The model has been up-
29400		dated but may not be accurate enough to use.
29500	10	AD is not available.  A message is sent to the user asking if
29600		he wants to try again.  If he responds 'Y', it will be  read
29700		again; otherwise this error will be returned. The model  will
29800		not be updated.
29900	
30000		Whenever the camera program is running,  the  current  camera
30100	model can be found in global real array CAMERA_MODEL as follows:
30200	
30300		1:3,1:3 is colineation matrix (TABLE → SCREEN)
30400		4,1:3 is lens center in table coordinates
30500		5,1:2 screen coords of point on image plane pierced by
30600			the axis of the lens
30602		5,3 is always 1
30700		6:8,1:3 inverse colineation matrix (SCREEN→TABLE);
30702		9,1:3 contains the pot readings, in radians,  for PAN,  TILT,
30703			and FOCUS
30704		10,1 is the camera number
30706		10,2 is the lens number
30708		10,3 is always 0
     

00100		The following routines are contemplated but not coded yet:
00200	
00300	COMPLEX	the complex body recognizer
00400	REFIND	retrace a blob or object already found
00500	ARM	an arm driver
00600	
00700	
00800	
00900	
01000	The final solution to the vision problem is now:
01100	
01200	OBJ←SIMPL(CURVE(INNER(GETEDGE(0,FALSE))),{EVERY},TO_REJECT);